'''按页爬取北京58同城出租信息'''
import requests
from requests.exceptions import RequestException
import re,json

def get_one_Page(url):
    '''爬取指定url页面一页的信息'''
    try:
        #定义Reques Headers请求头信息,模拟浏览器特征
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3452.0 Safari/537.36',
        }
        # 执行爬取
        response = requests.get(url,headers=headers)
        #判断响应状态,并响应爬取内容
        if response.status_code == 200:
            return response.text
        else:
            return None
    except RequestException:
        return None

def parse_Page(html):
    '''解析爬取网页中的内容，并返回字段结果'''
    #定义解析正则表达式
    pat = '<h2>.*?<a.*?tongji_label="listclick".*?>(.*?)</a>.*?lazy_src="(.*?)".*?<p class="room">(.*?)&nbsp;&nbsp;&nbsp;&nbsp;(.*?)</p>.*?<div class="money">.*?<b>(.*?)</b>'
    #执行解析
    items = re.findall(pat,html,re.S)
    #遍历封装数据并返回
    for item in items:
        yield {
            '标题':item[0].strip(),
            '图片':"http:"+item[1].strip(),
            '户型':item[2].strip()+'|'+item[3],
            '价格':item[4]+'元/月'
        }
def write_File(content,page):
    '''执行写入文件操作'''
    with open("./北京58租房信息第"+page+"页.txt", 'a', encoding='utf-8') as f:
        f.write(json.dumps(content,ensure_ascii=False) + "\n")
        f.close()

def main(page):
    ''' 主程序函数，负责调度执行爬虫处理 '''
    url = "http://bj.58.com/chuzu/pn"+page+"/?ClickID=1"
    html = get_one_Page(url)
    #判断是否爬取到数据，并调用解析函数
    i=0
    for item in parse_Page(html):
        # print(item)
        write_File(item,page)
        i+=1
        print("正在存储第 %d 条数据"%(i))
    print("数据存储完毕，请查看当前文件夹下txt文件")
    

# 判断当前执行是否为主程序运行，并遍历调用主函数爬取数据
if __name__ == '__main__':
    while True:
        page = input("请输入要爬取网页页码（1-70），输入q退出：")
        if page == 'q':
            break
        else:
            main(page)
